﻿using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.Odbc;
using WLMCoreLibrary;

using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Configuration;
using System.IO;
using HyperSoft.ElectronicDocumentLibrary.Base;
using HyperSoft.ElectronicDocumentLibrary.Certificate;
using HyperSoft.ElectronicDocumentLibrary.Document;
using HyperSoft.ElectronicDocumentLibrary.Manage;

namespace SAW_Core
{
    public class Factura : BaseClass
    {


        #region public properties
        public int idEmpresa { get; set; }
        public int idCliente { get; set; }
        public int NoFolio { get; set; }
        public DateTime FechaFacturacion { get; set; }
        public String Serie { get; set; }
        public String NoAprovacion { get; set; }
        public String AnoAprovacion { get; set; }
        public int TipoComprobante { get; set; }
        public String FormaPago { get; set; }
        public String MetodoPago { get; set; }
        public Decimal Descuento { get; set; }
        public String MotivoDescuento { get; set; }
        public String E_RFC { get; set; }
        public String E_RazonSocial { get; set; }
        public String E_Calle { get; set; }
        public String E_NumeroExterior { get; set; }
        public String E_NumeroInterior { get; set; }
        public String E_Colonia { get; set; }
        public String E_Municipio { get; set; }
        public String E_Ciudad { get; set; }
        public String E_Estado { get; set; }
        public String E_CP { get; set; }
        public String E_Referencia { get; set; }
        public String R_RFC { get; set; }
        public String R_RazonSocial { get; set; }
        public String R_Calle { get; set; }
        public String R_NumeroExterior { get; set; }
        public String R_NumeroInterior { get; set; }
        public String R_Colonia { get; set; }
        public String R_Municipio { get; set; }
        public String R_Ciudad { get; set; }
        public String R_Estado { get; set; }
        public String R_CP { get; set; }
        public String R_Referencia { get; set; }
        public int Impuesto { get; set; }
        public Decimal TasaImpuesto { get; set; }
        public Boolean CFDGenerado { get; set; }
        public String ArchivoCFDXML { get; set; }
        public String ArchivoCFDXMLPDF { get; set; }
        public DateTime fechaGeneracionCFD { get; set; }
        public Decimal SubTotal { get; set; }
        public Decimal Total { get; set; }
        public int idSerie { get; set; }
        public int idCotizacion
        {
            get;
            set;
        }
        public string FullFolio { get; set; }
        public double SaldoPendiente
        {
            get;
            set;
        }

        public double SaldoPagado
        {
            get;
            set;
        }

        public FacturasitemsCollection Items
        {
            get;
            set;
        }
        public List<Facturasitems> Conceptos
        {
            get;
            set;
        }
        private string _comentarios;

        public string Observaciones
        {
            get;
            set;
        }
        #endregion

        #region constructors
        public Factura(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("FACTURAS");
            string queryString = "";
            queryString = "SELECT * FROM FACTURAS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public Factura(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM FACTURAS WHERE id='" + registryId + "'";
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            this.GetRecord(queryString);
        }
        public Factura(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods
        public void CargarDatosSerie(FacturaSerie serie)
        {
            Serie = serie.SerieFactura;
            serie.UltimoFolioUtilizado++;
            NoFolio = serie.UltimoFolioUtilizado;
            serie.FechaUltimaFactura = DateTime.Now;
            serie.Save();
            idSerie = serie.id;
            NoAprovacion = serie.NoAprovacion;
            MetodoPago = "Efectivo";
            FormaPago = "Contado";
            TipoComprobante = 1;
            FechaFacturacion = DateTime.Now;
            TasaImpuesto = 16;
            Impuesto = 1;
            AnoAprovacion = serie.AnoAprovacion;
            E_RazonSocial = serie.RazonSocial;
            E_RFC = serie.RFC;
            E_Calle = serie.Calle;
            E_NumeroExterior = serie.NumeroExterior;
            E_NumeroInterior = "ninguno";
            E_Colonia = serie.Colonia;
            E_Municipio = serie.Municipio;
            E_Estado = serie.Estado;
            E_CP = serie.CP;
            E_Referencia = "";
        }


        public void CargarDatosCliente(Cliente cliente)
        {
            R_RazonSocial = cliente.RazonSocial;
            R_RazonSocial = cliente.RazonSocial;
            R_RFC = cliente.RFC;
            R_Calle = cliente.DireccionFacturacion.Calle;
            R_NumeroExterior = cliente.DireccionFacturacion.NumeroExterior;
            R_NumeroInterior = " ";
            R_Colonia = cliente.DireccionFacturacion.Colonia;
            R_Municipio = cliente.DireccionFacturacion.Municipio;
            R_Estado = cliente.DireccionFacturacion.Estado;
            R_CP = cliente.DireccionFacturacion.CP;
            R_Referencia = " ";

        }

        public void CargarDatosCotizacion(Venta cotizacion, decimal porcentajeCotizacion)
        {
            TasaImpuesto = 16;
            SubTotal = cotizacion.SubTotal * porcentajeCotizacion;
            Descuento = cotizacion.Descuento;
            Total = cotizacion.Total * porcentajeCotizacion;
            SaldoPendiente = Convert.ToDouble(cotizacion.Total * porcentajeCotizacion);
            Items = new FacturasitemsCollection();
            Items.Elementos = new List<Facturasitems>();
            Observaciones = cotizacion.Observaciones;
            foreach (VentaItem con in cotizacion.Conceptos)
            {
                Facturasitems concepto = new Facturasitems(ref ConexionDBInterna);
                concepto.cantidad = con.Cantidad;
                concepto.Unidad = con.UnidadMedida;
                concepto.Descripcion = con.Descripcion;
                concepto.ClaveProducto = con.Clave;
                concepto.Precio = con.Precio * porcentajeCotizacion;
                concepto.idFactura = id;
                concepto.Save();
                Items.Elementos.Add(concepto);
            }
        }


        public string GenerarFacturaElectronica(string directorioSalida, string archivoFolios, string archivoCer, string archivoKey, string passKey, string archivoCertificadores, string archivoRevocados)
        {
            return GenerateEInvoice(directorioSalida, archivoFolios, archivoCer, archivoKey, passKey, archivoCertificadores, archivoRevocados);
        }

        public void CargarConceptos()
        {
            FacturasitemsCollection listaItems= new FacturasitemsCollection(this, ref ConexionDBInterna);
            Conceptos = new List<Facturasitems>();
            foreach (Facturasitems it in listaItems.Elementos)
            {
                Conceptos.Add(it);
            }
        }

        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM FACTURAS WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idEmpresa")))
                    idEmpresa = (System.Int32)reader["idEmpresa"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCliente")))
                    idCliente = (System.Int32)reader["idCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoFolio")))
                    NoFolio = (System.Int32)reader["NoFolio"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaFacturacion")))
                    FechaFacturacion = Convert.ToDateTime(reader["FechaFacturacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("Serie")))
                    Serie = (System.String)reader["Serie"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoAprovacion")))
                    NoAprovacion = (System.String)reader["NoAprovacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("AnoAprovacion")))
                    AnoAprovacion = (System.String)reader["AnoAprovacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("TipoComprobante")))
                    TipoComprobante = (System.Int32)reader["TipoComprobante"];
                if (!reader.IsDBNull(reader.GetOrdinal("FormaPago")))
                    FormaPago = (System.String)reader["FormaPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("MetodoPago")))
                    MetodoPago = (System.String)reader["MetodoPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("Descuento")))
                    Descuento = (System.Decimal)reader["Descuento"];
                if (!reader.IsDBNull(reader.GetOrdinal("MotivoDescuento")))
                    MotivoDescuento = (System.String)reader["MotivoDescuento"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_RFC")))
                    E_RFC = (System.String)reader["E_RFC"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_RazonSocial")))
                    E_RazonSocial = (System.String)reader["E_RazonSocial"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Calle")))
                    E_Calle = (System.String)reader["E_Calle"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_NumeroExterior")))
                    E_NumeroExterior = (System.String)reader["E_NumeroExterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_NumeroInterior")))
                    E_NumeroInterior = (System.String)reader["E_NumeroInterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Colonia")))
                    E_Colonia = (System.String)reader["E_Colonia"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Municipio")))
                    E_Municipio = (System.String)reader["E_Municipio"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Ciudad")))
                    E_Ciudad = (System.String)reader["E_Ciudad"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Estado")))
                    E_Estado = (System.String)reader["E_Estado"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_CP")))
                    E_CP = (System.String)reader["E_CP"];
                if (!reader.IsDBNull(reader.GetOrdinal("E_Referencia")))
                    E_Referencia = (System.String)reader["E_Referencia"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_RFC")))
                    R_RFC = (System.String)reader["R_RFC"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_RazonSocial")))
                    R_RazonSocial = (System.String)reader["R_RazonSocial"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Calle")))
                    R_Calle = (System.String)reader["R_Calle"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_NumeroExterior")))
                    R_NumeroExterior = (System.String)reader["R_NumeroExterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_NumeroInterior")))
                    R_NumeroInterior = (System.String)reader["R_NumeroInterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Colonia")))
                    R_Colonia = (System.String)reader["R_Colonia"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Municipio")))
                    R_Municipio = (System.String)reader["R_Municipio"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Ciudad")))
                    R_Ciudad = (System.String)reader["R_Ciudad"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Estado")))
                    R_Estado = (System.String)reader["R_Estado"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_CP")))
                    R_CP = (System.String)reader["R_CP"];
                if (!reader.IsDBNull(reader.GetOrdinal("R_Referencia")))
                    R_Referencia = (System.String)reader["R_Referencia"];
                if (!reader.IsDBNull(reader.GetOrdinal("Impuesto")))
                    Impuesto = (System.Int32)reader["Impuesto"];
                if (!reader.IsDBNull(reader.GetOrdinal("TasaImpuesto")))
                    TasaImpuesto = (System.Decimal)reader["TasaImpuesto"];
                if (!reader.IsDBNull(reader.GetOrdinal("CFDGenerado")))
                    CFDGenerado = Convert.ToBoolean(reader["CFDGenerado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoCFDXML")))
                    ArchivoCFDXML = (System.String)reader["ArchivoCFDXML"];
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoCFDXMLPDF")))
                    ArchivoCFDXMLPDF = (System.String)reader["ArchivoCFDXMLPDF"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaGeneracionCFD")))
                    fechaGeneracionCFD = Convert.ToDateTime(reader["fechaGeneracionCFD"]);
                if (!reader.IsDBNull(reader.GetOrdinal("SubTotal")))
                    SubTotal = (System.Decimal)reader["SubTotal"];
                if (!reader.IsDBNull(reader.GetOrdinal("Total")))
                    Total = (System.Decimal)reader["Total"];
                if (!reader.IsDBNull(reader.GetOrdinal("idSerie")))
                    idSerie = (System.Int32)reader["idSerie"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCotizacion")))
                    idCotizacion = (System.Int32)reader["idCotizacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("saldoPendiente")))
                    SaldoPendiente = (System.Double)reader["saldoPendiente"];
                if (!reader.IsDBNull(reader.GetOrdinal("saldoPagado")))
                    SaldoPagado = (System.Double)reader["saldoPagado"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idEmpresa"] != null)
                    idEmpresa = (System.Int32)dataRow["idEmpresa"];
                if (dataRow["idCliente"] != null)
                    idCliente = (System.Int32)dataRow["idCliente"];
                if (dataRow["NoFolio"] != null)
                    NoFolio = (System.Int32)dataRow["NoFolio"];
                if (dataRow["FechaFacturacion"] != null)
                    FechaFacturacion = (System.DateTime)dataRow["FechaFacturacion"];
                if (dataRow["Serie"] != null)
                    Serie = (System.String)dataRow["Serie"];
                if (dataRow["NoAprovacion"] != null)
                    NoAprovacion = (System.String)dataRow["NoAprovacion"];
                if (dataRow["AnoAprovacion"] != null)
                    AnoAprovacion = (System.String)dataRow["AnoAprovacion"];
                if (dataRow["TipoComprobante"] != null)
                    TipoComprobante = (System.Int32)dataRow["TipoComprobante"];
                if (dataRow["FormaPago"] != null)
                    FormaPago = (System.String)dataRow["FormaPago"];
                if (dataRow["MetodoPago"] != null)
                    MetodoPago = (System.String)dataRow["MetodoPago"];
                if (dataRow["Descuento"] != null)
                    Descuento = (System.Decimal)dataRow["Descuento"];
                if (dataRow["MotivoDescuento"] != null)
                    MotivoDescuento = (System.String)dataRow["MotivoDescuento"];
                if (dataRow["E_RFC"] != null)
                    E_RFC = (System.String)dataRow["E_RFC"];
                if (dataRow["E_RazonSocial"] != null)
                    E_RazonSocial = (System.String)dataRow["E_RazonSocial"];
                if (dataRow["E_Calle"] != null)
                    E_Calle = (System.String)dataRow["E_Calle"];
                if (dataRow["E_NumeroExterior"] != null)
                    E_NumeroExterior = (System.String)dataRow["E_NumeroExterior"];
                if (dataRow["E_NumeroInterior"] != null)
                    E_NumeroInterior = (System.String)dataRow["E_NumeroInterior"];
                if (dataRow["E_Colonia"] != null)
                    E_Colonia = (System.String)dataRow["E_Colonia"];
                if (dataRow["E_Municipio"] != null)
                    E_Municipio = (System.String)dataRow["E_Municipio"];
                if (dataRow["E_Ciudad"] != null)
                    E_Ciudad = (System.String)dataRow["E_Ciudad"];
                if (dataRow["E_Estado"] != null)
                    E_Estado = (System.String)dataRow["E_Estado"];
                if (dataRow["E_CP"] != null)
                    E_CP = (System.String)dataRow["E_CP"];
                if (dataRow["E_Referencia"] != null)
                    E_Referencia = (System.String)dataRow["E_Referencia"];
                if (dataRow["R_RFC"] != null)
                    R_RFC = (System.String)dataRow["R_RFC"];
                if (dataRow["R_RazonSocial"] != null)
                    R_RazonSocial = (System.String)dataRow["R_RazonSocial"];
                if (dataRow["R_Calle"] != null)
                    R_Calle = (System.String)dataRow["R_Calle"];
                if (dataRow["R_NumeroExterior"] != null)
                    R_NumeroExterior = (System.String)dataRow["R_NumeroExterior"];
                if (dataRow["R_NumeroInterior"] != null)
                    R_NumeroInterior = (System.String)dataRow["R_NumeroInterior"];
                if (dataRow["R_Colonia"] != null)
                    R_Colonia = (System.String)dataRow["R_Colonia"];
                if (dataRow["R_Municipio"] != null)
                    R_Municipio = (System.String)dataRow["R_Municipio"];
                if (dataRow["R_Ciudad"] != null)
                    R_Ciudad = (System.String)dataRow["R_Ciudad"];
                if (dataRow["R_Estado"] != null)
                    R_Estado = (System.String)dataRow["R_Estado"];
                if (dataRow["R_CP"] != null)
                    R_CP = (System.String)dataRow["R_CP"];
                if (dataRow["R_Referencia"] != null)
                    R_Referencia = (System.String)dataRow["R_Referencia"];
                if (dataRow["Impuesto"] != null)
                    Impuesto = (System.Int32)dataRow["Impuesto"];
                if (dataRow["TasaImpuesto"] != null)
                    TasaImpuesto = (System.Decimal)dataRow["TasaImpuesto"];
                if (dataRow["CFDGenerado"] != null)
                    CFDGenerado = (bool)dataRow["CFDGenerado"];
                if (dataRow["ArchivoCFDXML"] != null)
                    ArchivoCFDXML = (System.String)dataRow["ArchivoCFDXML"];
                if (dataRow["ArchivoCFDXMLPDF"] != null)
                    ArchivoCFDXMLPDF = (System.String)dataRow["ArchivoCFDXMLPDF"];
                if (dataRow["fechaGeneracionCFD"] != null)
                    fechaGeneracionCFD = (System.DateTime)dataRow["fechaGeneracionCFD"];
                if (dataRow["SubTotal"] != null)
                    SubTotal = (System.Decimal)dataRow["SubTotal"];
                if (dataRow["Total"] != null)
                    Total = (System.Decimal)dataRow["Total"];
                if (dataRow["idSerie"] != null)
                    idSerie = (System.Int32)dataRow["idSerie"];
                if (dataRow["idCotizacion"] != null)
                    idCotizacion = (System.Int32)dataRow["idCotizacion"];
                if (dataRow["saldoPagado"] != null)
                    SaldoPagado = (System.Double)dataRow["saldoPagado"];
                if (dataRow["saldoPendiente"] != null)
                    SaldoPendiente = (System.Double)dataRow["saldoPendiente"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE FACTURAS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idEmpresa='" + this.idEmpresa.ToString() + "'");
            strCommand.Append(",idCliente='" + this.idCliente.ToString() + "'");
            strCommand.Append(",NoFolio='" + NoFolio.ToString() + "'");
            strCommand.Append(",FechaFacturacion='" + FechaFacturacion.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",Serie=\"" + WLMFunctions.comillas(Serie) + "\"");
            strCommand.Append(",NoAprovacion=\"" + WLMFunctions.comillas(NoAprovacion) + "\"");
            strCommand.Append(",AnoAprovacion=\"" + WLMFunctions.comillas(AnoAprovacion) + "\"");
            strCommand.Append(",TipoComprobante='" + TipoComprobante.ToString() + "'");
            strCommand.Append(",FormaPago=\"" + WLMFunctions.comillas(FormaPago) + "\"");
            strCommand.Append(",MetodoPago=\"" + WLMFunctions.comillas(MetodoPago) + "\"");
            strCommand.Append(",Descuento=\"" + WLMFunctions.comillas(Descuento) + "\"");
            strCommand.Append(",MotivoDescuento=\"" + WLMFunctions.comillas(MotivoDescuento) + "\"");
            strCommand.Append(",E_RFC=\"" + WLMFunctions.comillas(E_RFC) + "\"");
            strCommand.Append(",E_RazonSocial=\"" + WLMFunctions.comillas(E_RazonSocial) + "\"");
            strCommand.Append(",E_Calle=\"" + WLMFunctions.comillas(E_Calle) + "\"");
            strCommand.Append(",E_NumeroExterior=\"" + WLMFunctions.comillas(E_NumeroExterior) + "\"");
            strCommand.Append(",E_NumeroInterior=\"" + WLMFunctions.comillas(E_NumeroInterior) + "\"");
            strCommand.Append(",E_Colonia=\"" + WLMFunctions.comillas(E_Colonia) + "\"");
            strCommand.Append(",E_Municipio=\"" + WLMFunctions.comillas(E_Municipio) + "\"");
            strCommand.Append(",E_Ciudad=\"" + WLMFunctions.comillas(E_Ciudad) + "\"");
            strCommand.Append(",E_Estado=\"" + WLMFunctions.comillas(E_Estado) + "\"");
            strCommand.Append(",E_CP=\"" + WLMFunctions.comillas(E_CP) + "\"");
            strCommand.Append(",E_Referencia=\"" + WLMFunctions.comillas(E_Referencia) + "\"");
            strCommand.Append(",R_RFC=\"" + WLMFunctions.comillas(R_RFC) + "\"");
            strCommand.Append(",R_RazonSocial=\"" + WLMFunctions.comillas(R_RazonSocial) + "\"");
            strCommand.Append(",R_Calle=\"" + WLMFunctions.comillas(R_Calle) + "\"");
            strCommand.Append(",R_NumeroExterior=\"" + WLMFunctions.comillas(R_NumeroExterior) + "\"");
            strCommand.Append(",R_NumeroInterior=\"" + WLMFunctions.comillas(R_NumeroInterior) + "\"");
            strCommand.Append(",R_Colonia=\"" + WLMFunctions.comillas(R_Colonia) + "\"");
            strCommand.Append(",R_Municipio=\"" + WLMFunctions.comillas(R_Municipio) + "\"");
            strCommand.Append(",R_Ciudad=\"" + WLMFunctions.comillas(R_Ciudad) + "\"");
            strCommand.Append(",R_Estado=\"" + WLMFunctions.comillas(R_Estado) + "\"");
            strCommand.Append(",R_CP=\"" + WLMFunctions.comillas(R_CP) + "\"");
            strCommand.Append(",R_Referencia=\"" + WLMFunctions.comillas(R_Referencia) + "\"");
            strCommand.Append(",Impuesto='" +Impuesto.ToString() + "'");
            strCommand.Append(",TasaImpuesto=\"" + WLMFunctions.comillas(TasaImpuesto) + "\"");
            strCommand.Append(",CFDGenerado='" + Convert.ToInt16(CFDGenerado) + "'");
            strCommand.Append(",ArchivoCFDXML=\"" + WLMFunctions.comillas(ArchivoCFDXML) + "\"");
            strCommand.Append(",ArchivoCFDXMLPDF=\"" + WLMFunctions.comillas(ArchivoCFDXMLPDF) + "\"");
            strCommand.Append(",fechaGeneracionCFD='" + fechaGeneracionCFD.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",SubTotal=\"" + WLMFunctions.comillas(SubTotal) + "\"");
            strCommand.Append(",Total=\"" + WLMFunctions.comillas(Total) + "\"");
            strCommand.Append(",idSerie='" + this.idSerie.ToString() + "'");
            strCommand.Append(",idCotizacion='" + this.idCotizacion.ToString() + "'");
            strCommand.Append(",saldoPendiente=\"" +SaldoPendiente + "\"");
            strCommand.Append(",saldoPagado=\"" + SaldoPagado + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }


        private string GenerateEInvoice(string directorioSalida, string archivoFolios, string archivoCer, string archivoKey, string passKey, string archivoCertificadores, string archivoRevocados)
        {
            string applicationDirectory = "";
            string generationDirectory = "";
            ElectronicManage manage;
            ElectronicCertificate certificate;
            ElectronicDocument electronicDocument;
            Partida partida;
            Importacion importacion;
            Concepto concepto;
            Traslado traslado;


            manage = ElectronicManage.NewEntity();
            manage.Save.Options = (manage.Save.Options | SaveOptions.ValidateCertificateSubject) ^ SaveOptions.ValidateCertificateSubject;


            manage = ElectronicManage.NewEntity();


            // Por motivos de la demos, se elimina la validación de que el RFC del
            // emisor sea igual a los datos del certificado, ya que si agrego esta validación
            // me da error con el folio, ya que para el certificados de pruebas no existen
            // folios autorizados. PARA UN AMBIENTE DE PRODUCCION ESTA OPCION DEBE ESTA ACTIVADA
            manage.Save.Options = (manage.Save.Options | SaveOptions.ValidateCertificateSubject) ^ SaveOptions.ValidateCertificateSubject; //manage.Save.Options - [SaveOptions.ValidateCertificateSubject]

            // Se cargan a memoria el archivo de autoridades certificadoras de prueba
            // Este línea de codigo debe ser elimina en un ambiente de producción
            manage.CertificateAuthorityList.UseForTest();

            // Se cargan a memoria el archivo de autoridades certificadoras y el archivo de certificados de emisores de CFD
            manage.ElectronicCertificateList.Load(archivoCertificadores);

            // Se define el archivo de las CERTIFICADOS REVOCADOS que es emitido por el SAT; el cual es cargado a memoria
            // hasta el momento de ser usado, esto con la finalidad de que no se tenga objetos cargados hasta que
            // realmente no se vayan a usar.
            manage.CertificateRevocationList.FileName = archivoRevocados;

            // En este caso se indica que se cargue el contenido del archivo a memoria, ya que quiero mostrar lo rápido
            // que es el proceso de generación, y la carga de este archivo la primera vez toma varios segundos.
            manage.CertificateRevocationList.Prepare();

            // Se define el archivo de las FOLIOS AUTORIZADOS por el SAT; el cual es cargado a memoria hasta el momento
            // de ser usado, esto con la finalidad de que no se tenga objetos cargados hasta que realmente no se vayan a usar.
            manage.FolioAutorizadoList.FileName = archivoFolios;

            // En este caso se indica que se cargue el contenido del archivo a memoria, ya que quiero mostrar lo rápido
            // que es el proceso de generación, y la carga de este archivo la primera vez toma varios segundos.
            manage.FolioAutorizadoList.Prepare();

            // Se crea la clase que va a ser usada en el proceso de firmado, se le pasa el certificado,
            // la llave privada y el password de la misma.
            certificate = ElectronicCertificate.NewEntity(archivoCer,
                                                         archivoKey,
                                                          passKey);

            // Asignamos el certificado al objeto Manage, esta ultima, es la encargada de contener
            // y administrar TODOS los recursos que serán usados en el proceso
            manage.Save.AssignCertificate(certificate);


            // Se instancia la clase que es la encarga de llevar a cabo el proceso de generación y se le pasa
            // el objeto que tiene todos los recursos necesarios para llevar a cabo dicho proceso.
            electronicDocument = ElectronicDocument.NewEntity();
            electronicDocument.AssignManage(manage);

            // Se crea el directorio donde van a ser almacenado los CFD generados, esto no tiene que ver con la librería,
            // solo es para mantener ordenados los archivos generados.  generationDirectory = applicationDirectory + "\\Generados\\";
            generationDirectory = directorioSalida;

            electronicDocument.Data.Clear();

            // Datos del comprobante ****************************************************************
            electronicDocument.Data.Version.Value = "2.0";
            electronicDocument.Data.Serie.Value = Serie;
            electronicDocument.Data.Folio.Value = NoFolio.ToString();
            electronicDocument.Data.Fecha.Value = FechaFacturacion;
            electronicDocument.Data.AnioAprobacion.Value = Convert.ToInt32(AnoAprovacion);
            electronicDocument.Data.NumeroAprobacion.Value = Convert.ToInt32(NoAprovacion);
            electronicDocument.Data.FormaPago.Value = "Pago en una sola exhibicion";
            electronicDocument.Data.CondicionesPago.Value = "Efectivo";
            electronicDocument.Data.SubTotal.Value = Convert.ToDouble(SubTotal);
            electronicDocument.Data.Descuento.Value = Convert.ToDouble(Descuento);
            //electronicDocument.Data.MotivoDescuento.Value = "5% de descuento por pago en efectivo";
            electronicDocument.Data.Total.Value = Convert.ToDouble(Total);
            electronicDocument.Data.MetodoPago.Value = "Efectivo";
            electronicDocument.Data.TipoComprobante.Value = "ingreso";
            // ***************************************************************************************

            // Datos del emisor ********************************************************************
            electronicDocument.Data.Emisor.Rfc.Value = E_RFC;
            electronicDocument.Data.Emisor.Nombre.Value = E_RazonSocial;

            // Domicilio fiscal del emisor
            electronicDocument.Data.Emisor.Domicilio.Calle.Value = E_Calle;
            electronicDocument.Data.Emisor.Domicilio.NumeroExterior.Value = E_NumeroExterior;
            //electronicDocument.Data.Emisor.Domicilio.NumeroInterior.Value =E_NumeroInterior;
            electronicDocument.Data.Emisor.Domicilio.Colonia.Value = E_Colonia;
            //electronicDocument.Data.Emisor.Domicilio.Localidad.Value = E_Municipio;
            //electronicDocument.Data.Emisor.Domicilio.Referencia.Value = "Entre León y Manzanillo";

            electronicDocument.Data.Emisor.Domicilio.Municipio.Value = E_Municipio;
            electronicDocument.Data.Emisor.Domicilio.Estado.Value = E_Estado;
            electronicDocument.Data.Emisor.Domicilio.Pais.Value = "México";
            electronicDocument.Data.Emisor.Domicilio.CodigoPostal.Value = E_CP;

            // Lugar donde se expidio el documento
            electronicDocument.Data.Emisor.ExpedidoEn.Calle.Value = "Juarez Nte";
            electronicDocument.Data.Emisor.ExpedidoEn.NumeroExterior.Value = "79";
            //electronicDocument.Data.Emisor.ExpedidoEn.NumeroInterior.Value = "A";
            electronicDocument.Data.Emisor.ExpedidoEn.Colonia.Value = "Cuztitla";
            electronicDocument.Data.Emisor.ExpedidoEn.Localidad.Value = "Tizayuca";
            electronicDocument.Data.Emisor.ExpedidoEn.Municipio.Value = "Tizayuca";
            electronicDocument.Data.Emisor.ExpedidoEn.Estado.Value = "Hidalgo";
            electronicDocument.Data.Emisor.ExpedidoEn.Pais.Value = "México";
            electronicDocument.Data.Emisor.ExpedidoEn.CodigoPostal.Value = "43800";
            // ***************************************************************************************

            // Datos del Receptor ********************************************************************
            electronicDocument.Data.Receptor.Rfc.Value = R_RFC.Replace("-", "");
            electronicDocument.Data.Receptor.Nombre.Value = R_RazonSocial;

            // Domicilio fiscal del emisor
            electronicDocument.Data.Receptor.Domicilio.Calle.Value = R_Calle;
            electronicDocument.Data.Receptor.Domicilio.NumeroExterior.Value = R_NumeroExterior;
            electronicDocument.Data.Receptor.Domicilio.Colonia.Value = R_Colonia;
            //electronicDocument.Data.Receptor.Domicilio.Localidad.Value = "MEXICO";
            //electronicDocument.Data.Receptor.Domicilio.Referencia.Value = "Entre Morena y Esperanza";
            electronicDocument.Data.Receptor.Domicilio.Municipio.Value = R_Municipio;
            electronicDocument.Data.Receptor.Domicilio.Estado.Value = R_Estado;
            electronicDocument.Data.Receptor.Domicilio.Pais.Value = "MEXICO";
            electronicDocument.Data.Receptor.Domicilio.CodigoPostal.Value = R_CP;
            // ***************************************************************************************

            // Concepto  No 1 ************************************************************************
            foreach (Facturasitems item in Items.Elementos)
            {
                concepto = electronicDocument.Data.Conceptos.Add();
                concepto.Cantidad.Value = Convert.ToDouble(item.cantidad);
                concepto.Unidad.Value = item.Unidad;
                concepto.Descripcion.Value = item.Descripcion;
                concepto.ValorUnitario.Value = Convert.ToDouble(item.Precio);
                concepto.Importe.Value = Convert.ToDouble(item.cantidad * item.Precio);
                concepto.NumeroIdentificacion.Value = item.ClaveProducto;
            }



            // Impuestos trasladados ************************************************************************
            traslado = electronicDocument.Data.Impuestos.Traslados.Add();
            traslado.Tasa.Value = Convert.ToDouble(TasaImpuesto);
            traslado.Tipo.Value = "IVA";
            traslado.Importe.Value = Convert.ToDouble((TasaImpuesto / 100) * SubTotal);

            // Impuestos retenidos ************************************************************************
            // Código para agregar impuestos retenidos al ACFD
            //
            // index = electronicDocument.Data.Impuestos.Retenciones.Add();
            // electronicDocument.Data.Impuestos.Retenciones[index].Tasa.Value    = 16;
            // electronicDocument.Data.Impuestos.Retenciones[index].Tipo.Value    = "IVA";
            // electronicDocument.Data.Impuestos.Retenciones[index].Importe.Value = 1094.4;


            electronicDocument.Data.Impuestos.TotalTraslados.Value = Convert.ToDouble((TasaImpuesto / 100) * SubTotal);
            string directorio = generationDirectory + "/" + E_RFC + "/" + Serie + "/" + NoFolio.ToString("00000") + "/";
            if (!Directory.Exists(directorio))
                Directory.CreateDirectory(directorio);

            string filename = E_RFC + "_" + Serie + "_" + NoFolio.ToString("00000") + ".xml";
            string newFileName = directorio + filename;
            if (electronicDocument.SaveToFile(newFileName))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(newFileName);
                XmlNode nodoImpesion = doc.CreateElement("Impresion");
                nodoImpesion.InnerText = WLMFunctions.NumeroALetras(Total.ToString(), "PESOS");
                XmlNode nodoObservaciones = doc.CreateElement("Observaciones");
                nodoObservaciones.InnerText = Observaciones.Replace("\n", "<br/>");
                doc.DocumentElement.AppendChild(nodoImpesion);
                doc.DocumentElement.AppendChild(nodoObservaciones);
                doc.Save(newFileName);
                return filename;
            }

            else
                return electronicDocument.ErrorText;
        }

        #endregion
    }

    public class FacturaCollection
    {


        #region public properties
        public List<Factura> Elementos { get; set; }
        #endregion

        #region Constructors
        public FacturaCollection()
        {
        }

        public FacturaCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURAS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Factura>();
            while (dataReader.Read())
            {
                Factura newItem = new Factura(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public FacturaCollection(bool descOrder, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURAS order by id desc ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Factura>();
            while (dataReader.Read())
            {
                Factura newItem = new Factura(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public FacturaCollection(Venta cotizacion, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURAS WHERE idCotizacion='" + cotizacion.id + "'";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Factura>();
            while (dataReader.Read())
            {
                Factura newItem = new Factura(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
        #endregion
    }

    public class Facturasitems : BaseClass
    {


        #region public properties
        public int idFactura { get; set; }
        public int idEmpresa { get; set; }
        public Decimal cantidad { get; set; }
        public String Unidad { get; set; }
        public String ClaveProducto { get; set; }
        public String Descripcion { get; set; }
        public Decimal Precio { get; set; }
        #endregion

        #region constructors
        public Facturasitems(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("FACTURASITEMS");
            string queryString = "";
            queryString = "SELECT * FROM FACTURASITEMS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public Facturasitems(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM FACTURASITEMS WHERE id='" + registryId + "'";
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            this.GetRecord(queryString);
        }
        public Facturasitems(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM FACTURASITEMS WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idFactura")))
                    idFactura = (System.Int32)reader["idFactura"];
                if (!reader.IsDBNull(reader.GetOrdinal("idEmpresa")))
                    idEmpresa = (System.Int32)reader["idEmpresa"];
                if (!reader.IsDBNull(reader.GetOrdinal("cantidad")))
                    cantidad = (System.Decimal)reader["cantidad"];
                if (!reader.IsDBNull(reader.GetOrdinal("Unidad")))
                    Unidad = (System.String)reader["Unidad"];
                if (!reader.IsDBNull(reader.GetOrdinal("ClaveProducto")))
                    ClaveProducto = (System.String)reader["ClaveProducto"];
                if (!reader.IsDBNull(reader.GetOrdinal("Descripcion")))
                    Descripcion = (System.String)reader["Descripcion"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio")))
                    Precio = (System.Decimal)reader["Precio"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idFactura"] != null)
                    idFactura = (System.Int32)dataRow["idFactura"];
                if (dataRow["idEmpresa"] != null)
                    idEmpresa = (System.Int32)dataRow["idEmpresa"];
                if (dataRow["cantidad"] != null)
                    cantidad = (System.Decimal)dataRow["cantidad"];
                if (dataRow["Unidad"] != null)
                    Unidad = (System.String)dataRow["Unidad"];
                if (dataRow["ClaveProducto"] != null)
                    ClaveProducto = (System.String)dataRow["ClaveProducto"];
                if (dataRow["Descripcion"] != null)
                    Descripcion = (System.String)dataRow["Descripcion"];
                if (dataRow["Precio"] != null)
                    Precio = (System.Decimal)dataRow["Precio"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE FACTURASITEMS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idFactura='" + this.idFactura.ToString() + "'");
            strCommand.Append(",idEmpresa='" + this.idEmpresa.ToString() + "'");
            strCommand.Append(",cantidad=\"" + WLMFunctions.comillas(cantidad) + "\"");
            strCommand.Append(",Unidad=\"" + WLMFunctions.comillas(Unidad) + "\"");
            strCommand.Append(",ClaveProducto=\"" + WLMFunctions.comillas(ClaveProducto) + "\"");
            strCommand.Append(",Descripcion=\"" + WLMFunctions.comillas(Descripcion) + "\"");
            strCommand.Append(",Precio=\"" + WLMFunctions.comillas(Precio) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class FacturasitemsCollection
    {


        #region public properties
        public List<Facturasitems> Elementos { get; set; }
        #endregion

        #region Constructors
        public FacturasitemsCollection()
        {
        }

        public FacturasitemsCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURASITEMS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Facturasitems>();
            while (dataReader.Read())
            {
                Facturasitems newItem = new Facturasitems(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public FacturasitemsCollection(Factura factura, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURASITEMS WHERE idFactura=" + factura.id;
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Facturasitems>();
            while (dataReader.Read())
            {
                Facturasitems newItem = new Facturasitems(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
        #endregion
    }

    public class FacturaSerie : BaseClass
    {


        #region public properties
        public int idEmpresa { get; set; }
        public DateTime FechaUltimaFactura { get; set; }
        public String SerieFactura { get; set; }
        public int LimiteFolios { get; set; }
        public DateTime FechaUltimaAltaFolios { get; set; }
        public String SelloDigital { get; set; }
        public String FIEL { get; set; }
        public String DirectorioGeneracion { get; set; }
        public String CarpetaRelativaCFD { get; set; }
        public String ArchivoCertificado { get; set; }
        public String ArchivoKey { get; set; }
        public String KeyPassword { get; set; }
        public String ArchivoRevocados { get; set; }
        public String ArchivoCertificadores { get; set; }
        public int UltimoFolioUtilizado { get; set; }
        public String NoAprovacion { get; set; }
        public String AnoAprovacion { get; set; }
        public String archivoFolios { get; set; }
        public String RazonSocial { get; set; }
        public String RFC { get; set; }
        public String Calle { get; set; }
        public String NumeroExterior { get; set; }
        public String NumeroInterior { get; set; }
        public String Colonia { get; set; }
        public String Localidad { get; set; }
        public String Municipio { get; set; }
        public String Estado { get; set; }
        public String Pais { get; set; }
        public String CP { get; set; }
        #endregion

        #region constructors
        public FacturaSerie(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("FACTURASSERIES");
            string queryString = "";
            queryString = "SELECT * FROM FACTURASSERIES WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public FacturaSerie(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM FACTURASSERIES WHERE id='" + registryId + "'";
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            this.GetRecord(queryString);
        }
        public FacturaSerie(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM FACTURASSERIES WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idEmpresa")))
                    idEmpresa = (System.Int32)reader["idEmpresa"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaUltimaFactura")))
                    FechaUltimaFactura = Convert.ToDateTime(reader["FechaUltimaFactura"]);
                if (!reader.IsDBNull(reader.GetOrdinal("SerieFactura")))
                    SerieFactura = (System.String)reader["SerieFactura"];
                if (!reader.IsDBNull(reader.GetOrdinal("LimiteFolios")))
                    LimiteFolios = (System.Int32)reader["LimiteFolios"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaUltimaAltaFolios")))
                    FechaUltimaAltaFolios = Convert.ToDateTime(reader["FechaUltimaAltaFolios"]);
                if (!reader.IsDBNull(reader.GetOrdinal("SelloDigital")))
                    SelloDigital = (System.String)reader["SelloDigital"];
                if (!reader.IsDBNull(reader.GetOrdinal("FIEL")))
                    FIEL = (System.String)reader["FIEL"];
                if (!reader.IsDBNull(reader.GetOrdinal("DirectorioGeneracion")))
                    DirectorioGeneracion = (System.String)reader["DirectorioGeneracion"];
                if (!reader.IsDBNull(reader.GetOrdinal("CarpetaRelativaCFD")))
                    CarpetaRelativaCFD = (System.String)reader["CarpetaRelativaCFD"];
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoCertificado")))
                    ArchivoCertificado = (System.String)reader["ArchivoCertificado"];
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoKey")))
                    ArchivoKey = (System.String)reader["ArchivoKey"];
                if (!reader.IsDBNull(reader.GetOrdinal("KeyPassword")))
                    KeyPassword = (System.String)reader["KeyPassword"];
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoRevocados")))
                    ArchivoRevocados = (System.String)reader["ArchivoRevocados"];
                if (!reader.IsDBNull(reader.GetOrdinal("ArchivoCertificadores")))
                    ArchivoCertificadores = (System.String)reader["ArchivoCertificadores"];
                if (!reader.IsDBNull(reader.GetOrdinal("UltimoFolioUtilizado")))
                    UltimoFolioUtilizado = (System.Int32)reader["UltimoFolioUtilizado"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoAprovacion")))
                    NoAprovacion = (System.String)reader["NoAprovacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("AnoAprovacion")))
                    AnoAprovacion = (System.String)reader["AnoAprovacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("archivoFolios")))
                    archivoFolios = (System.String)reader["archivoFolios"];
                if (!reader.IsDBNull(reader.GetOrdinal("RazonSocial")))
                    RazonSocial = (System.String)reader["RazonSocial"];
                if (!reader.IsDBNull(reader.GetOrdinal("RFC")))
                    RFC = (System.String)reader["RFC"];
                if (!reader.IsDBNull(reader.GetOrdinal("Calle")))
                    Calle = (System.String)reader["Calle"];
                if (!reader.IsDBNull(reader.GetOrdinal("NumeroExterior")))
                    NumeroExterior = (System.String)reader["NumeroExterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("NumeroInterior")))
                    NumeroInterior = (System.String)reader["NumeroInterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("Colonia")))
                    Colonia = (System.String)reader["Colonia"];
                if (!reader.IsDBNull(reader.GetOrdinal("Localidad")))
                    Localidad = (System.String)reader["Localidad"];
                if (!reader.IsDBNull(reader.GetOrdinal("Municipio")))
                    Municipio = (System.String)reader["Municipio"];
                if (!reader.IsDBNull(reader.GetOrdinal("Estado")))
                    Estado = (System.String)reader["Estado"];
                if (!reader.IsDBNull(reader.GetOrdinal("Pais")))
                    Pais = (System.String)reader["Pais"];
                if (!reader.IsDBNull(reader.GetOrdinal("CP")))
                    CP = (System.String)reader["CP"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idEmpresa"] != null)
                    idEmpresa = (System.Int32)dataRow["idEmpresa"];
                if (dataRow["FechaUltimaFactura"] != null)
                    FechaUltimaFactura = (System.DateTime)dataRow["FechaUltimaFactura"];
                if (dataRow["SerieFactura"] != null)
                    SerieFactura = (System.String)dataRow["SerieFactura"];
                if (dataRow["LimiteFolios"] != null)
                    LimiteFolios = (System.Int32)dataRow["LimiteFolios"];
                if (dataRow["FechaUltimaAltaFolios"] != null)
                    FechaUltimaAltaFolios = (System.DateTime)dataRow["FechaUltimaAltaFolios"];
                if (dataRow["SelloDigital"] != null)
                    SelloDigital = (System.String)dataRow["SelloDigital"];
                if (dataRow["FIEL"] != null)
                    FIEL = (System.String)dataRow["FIEL"];
                if (dataRow["DirectorioGeneracion"] != null)
                    DirectorioGeneracion = (System.String)dataRow["DirectorioGeneracion"];
                if (dataRow["CarpetaRelativaCFD"] != null)
                    CarpetaRelativaCFD = (System.String)dataRow["CarpetaRelativaCFD"];
                if (dataRow["ArchivoCertificado"] != null)
                    ArchivoCertificado = (System.String)dataRow["ArchivoCertificado"];
                if (dataRow["ArchivoKey"] != null)
                    ArchivoKey = (System.String)dataRow["ArchivoKey"];
                if (dataRow["KeyPassword"] != null)
                    KeyPassword = (System.String)dataRow["KeyPassword"];
                if (dataRow["ArchivoRevocados"] != null)
                    ArchivoRevocados = (System.String)dataRow["ArchivoRevocados"];
                if (dataRow["ArchivoCertificadores"] != null)
                    ArchivoCertificadores = (System.String)dataRow["ArchivoCertificadores"];
                if (dataRow["UltimoFolioUtilizado"] != null)
                    UltimoFolioUtilizado = (System.Int32)dataRow["UltimoFolioUtilizado"];
                if (dataRow["NoAprovacion"] != null)
                    NoAprovacion = (System.String)dataRow["NoAprovacion"];
                if (dataRow["AnoAprovacion"] != null)
                    AnoAprovacion = (System.String)dataRow["AnoAprovacion"];
                if (dataRow["archivoFolios"] != null)
                    archivoFolios = (System.String)dataRow["archivoFolios"];
                if (dataRow["RazonSocial"] != null)
                    RazonSocial = (System.String)dataRow["RazonSocial"];
                if (dataRow["RFC"] != null)
                    RFC = (System.String)dataRow["RFC"];
                if (dataRow["Calle"] != null)
                    Calle = (System.String)dataRow["Calle"];
                if (dataRow["NumeroExterior"] != null)
                    NumeroExterior = (System.String)dataRow["NumeroExterior"];
                if (dataRow["NumeroInterior"] != null)
                    NumeroInterior = (System.String)dataRow["NumeroInterior"];
                if (dataRow["Colonia"] != null)
                    Colonia = (System.String)dataRow["Colonia"];
                if (dataRow["Localidad"] != null)
                    Localidad = (System.String)dataRow["Localidad"];
                if (dataRow["Municipio"] != null)
                    Municipio = (System.String)dataRow["Municipio"];
                if (dataRow["Estado"] != null)
                    Estado = (System.String)dataRow["Estado"];
                if (dataRow["Pais"] != null)
                    Pais = (System.String)dataRow["Pais"];
                if (dataRow["CP"] != null)
                    CP = (System.String)dataRow["CP"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE FACTURASSERIES set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idEmpresa='" + this.idEmpresa.ToString() + "'");
            strCommand.Append(",FechaUltimaFactura='" + this.FechaUltimaFactura.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",SerieFactura=\"" + WLMFunctions.comillas(SerieFactura) + "\"");
            strCommand.Append(",LimiteFolios='" + this.LimiteFolios.ToString() + "'");
            strCommand.Append(",FechaUltimaAltaFolios='" + this.FechaUltimaAltaFolios.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",SelloDigital=\"" + WLMFunctions.comillas(SelloDigital) + "\"");
            strCommand.Append(",FIEL=\"" + WLMFunctions.comillas(FIEL) + "\"");
            strCommand.Append(",DirectorioGeneracion=\"" + WLMFunctions.comillas(DirectorioGeneracion) + "\"");
            strCommand.Append(",CarpetaRelativaCFD=\"" + WLMFunctions.comillas(CarpetaRelativaCFD) + "\"");
            strCommand.Append(",ArchivoCertificado=\"" + WLMFunctions.comillas(ArchivoCertificado) + "\"");
            strCommand.Append(",ArchivoKey=\"" + WLMFunctions.comillas(ArchivoKey) + "\"");
            strCommand.Append(",KeyPassword=\"" + WLMFunctions.comillas(KeyPassword) + "\"");
            strCommand.Append(",ArchivoRevocados=\"" + WLMFunctions.comillas(ArchivoRevocados) + "\"");
            strCommand.Append(",ArchivoCertificadores=\"" + WLMFunctions.comillas(ArchivoCertificadores) + "\"");
            strCommand.Append(",UltimoFolioUtilizado='" + this.UltimoFolioUtilizado.ToString() + "'");
            strCommand.Append(",NoAprovacion=\"" + WLMFunctions.comillas(NoAprovacion) + "\"");
            strCommand.Append(",AnoAprovacion=\"" + WLMFunctions.comillas(AnoAprovacion) + "\"");
            strCommand.Append(",archivoFolios=\"" + WLMFunctions.comillas(archivoFolios) + "\"");
            strCommand.Append(",RazonSocial=\"" + WLMFunctions.comillas(RazonSocial) + "\"");
            strCommand.Append(",RFC=\"" + WLMFunctions.comillas(RFC) + "\"");
            strCommand.Append(",Calle=\"" + WLMFunctions.comillas(Calle) + "\"");
            strCommand.Append(",NumeroExterior=\"" + WLMFunctions.comillas(NumeroExterior) + "\"");
            strCommand.Append(",NumeroInterior=\"" + WLMFunctions.comillas(NumeroInterior) + "\"");
            strCommand.Append(",Colonia=\"" + WLMFunctions.comillas(Colonia) + "\"");
            strCommand.Append(",Localidad=\"" + WLMFunctions.comillas(Localidad) + "\"");
            strCommand.Append(",Municipio=\"" + WLMFunctions.comillas(Municipio) + "\"");
            strCommand.Append(",Estado=\"" + WLMFunctions.comillas(Estado) + "\"");
            strCommand.Append(",Pais=\"" + WLMFunctions.comillas(Pais) + "\"");
            strCommand.Append(",CP=\"" + WLMFunctions.comillas(CP) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }
    public class FacturaSerieCollection
    {


        #region public properties
        public List<FacturaSerie> Elementos { get; set; }
        #endregion

        #region Constructors
        public FacturaSerieCollection()
        {
        }

        public FacturaSerieCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM FACTURASSERIES ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<FacturaSerie>();
            while (dataReader.Read())
            {
                FacturaSerie newItem = new FacturaSerie(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
        #endregion
    }
}
